package nettyteach.endecoder;

import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.util.CharsetUtil;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author ligengxian
 * @Date 2022/4/25 上午10:23
 * @Version 1.0
 * @Description:服务器端行解码器
 **/
@ChannelHandler.Sharable
public class HandlerServerLineBased extends ChannelInboundHandlerAdapter {
    //通道数组，保存所有注册到eventloop的通道
//    public static ChannelGroup channels=new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//        super.channelRead(ctx, msg);
        //处理收到的数据，并反馈消息到客户端
//        ByteBuf in =(ByteBuf)msg;
//        System.out.println("接收客户端发过来的消息："+in.toString(CharsetUtil.UTF_8));
//        //写入并发送信息到远端（客户端）
//        SimpleDateFormat df=new SimpleDateFormat("HH:mm:ss SSS");//设置日期格式
//        String strDate=df.format(new Date());
//        ctx.writeAndFlush(Unpooled.copiedBuffer("这是服务器端在read方法中反馈的消息"+strDate+"\r\n",CharsetUtil.UTF_8));
        //处理收到的数据，并反馈消息到客户端
        String strInfo=(String)msg;
        System.out.println("收到客户端的消息"+strInfo.trim());

        //写入并发送消息到远端（客户端）
        SimpleDateFormat df=new SimpleDateFormat("HH:mm:ss SSS");
        String strDate=df.format(new Date());
        String strMsg="您好，客户端"+strDate+"\r\n";
        strMsg=CommonTools.formatString(strMsg,CommonTools.FIXEDLENGTHFRAME_LENGTH);
        System.out.println("向客户端反馈消息"+strMsg);
        ctx.writeAndFlush(Unpooled.copiedBuffer(strMsg,CharsetUtil.UTF_8));
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
//        super.exceptionCaught(ctx, cause);
        //出现异常的时候执行的动作（打印并关闭通道）
        cause.printStackTrace();
        ctx.close();
    }

    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
//
        //新建立链接时触发的动作
        Channel incoming =ctx.channel();
        System.out.println("客户端"+incoming.remoteAddress()+"已连接上来");
//        channels.add(incoming);
    }

    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
//        super.handlerRemoved(ctx);
        //连接断开时出发的动作
        Channel incoming=ctx.channel();
        System.out.println("客户端"+incoming.remoteAddress()+"已断开");
//        channels.remove(incoming);

    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
//        super.channelActive(ctx);
        //通道处于活动状态触发的动作，该方法只会在通道建立时调用一次
        Channel incoming=ctx.channel();
        System.out.println("客户端"+incoming.remoteAddress()+"在线");
//       //写入并发送信息到远端（客户端）
//        SimpleDateFormat df=new SimpleDateFormat("HH:mm:ss SSS");//设置日期格式
//        String strDate=df.format(new Date());
//        ctx.writeAndFlush(Unpooled.copiedBuffer("这是服务器端在Active方法中反馈的消息"+strDate+"\r\n",CharsetUtil.UTF_8));
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
//        super.channelInactive(ctx);
        Channel incoming=ctx.channel();
        System.out.println("客户端"+incoming.remoteAddress()+"掉线");
    }
}
